package com.fkc.javahansoulbms.util;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.MacAlgorithm;

import javax.crypto.SecretKey;
import java.util.Date;
import java.util.UUID;

// 对 Token 生成加密和解析
public class JwtUtils {
	
	// 使用固定密钥：使用固定的字符串生成 HMAC 密钥，方便在开发和测试时使用。
	// private static String secretKey = "r-k.Uv4D@rrX2aYiLOJJC-)!XBD=-#[^i,&vykXQYtU6p.pF4'xQ#GZ-4AS+ri)vhBEAyQFfpZ+";
	// private static SecretKey KEY = Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8));

	// 根据物理地址哈希得到，服务每次重启都不一样。
	// 使用生成密钥：使用 HS512 算法生成对称密钥。每次生成的密钥不同，因为是基于系统资源（如物理地址）的哈希值。
	private static MacAlgorithm ALG = Jwts.SIG.HS512; //or HS384 or HS256
	private static SecretKey KEY = ALG.key().build();
	
	private static final long EXPIRATION_MS = 8640000;             // 过期时间 24 小时
	
	// 生成 Token （签名方式与加密方式二选一）
	public static String generateToken(String userId) {
		return Jwts.builder()
				.subject(userId)        //
				.issuedAt(new Date())   // 设置签发时间为当前时间
				.expiration(new Date(System.currentTimeMillis() + EXPIRATION_MS))   // 过期时间
				.id(UUID.randomUUID().toString())   // 设置一个随机生成的唯一标识符
				.signWith(KEY)  // 签名方式
				// .encryptWith(key, Jwts.ENC.A256CBC_HS512)    // 加密方式，使用 AES 对称加密方式对 JWT 进行加密。
				.compact();
	}
	
	// 解析 Token（用于后续认证）
	public static String parseToken(String token) {
		return Jwts.parser()
				.verifyWith(KEY)    // 签名方式，指定用于验证的密钥
				// .decryptWith(KEY)   // 加密方式，指定用于解密的密钥。
				.build()
				.parseSignedClaims(token) // 签名方式，对 JWT 进行解密，并获取其声明部分。
				// .parseEncryptedClaims(token) // 加密方式，对 JWT 进行解密，并获取其声明部分。
				.getPayload()  // 获取解密后的声明（claims）内容
				.getSubject(); // 从 claims 中提取 subject 字段
	}
}
